﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.IO;
using System.Linq;
using System.Text;
using System.Text.RegularExpressions;
using System.Timers;
using System.Windows.Forms;

namespace monitor2._0
{
    public partial class FormMain : Form
    {
        //定时任务对象
        private System.Timers.Timer monitorTimer = null;
        //配置文件路径
        private static string configPath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "config.ini");
        //任务周期[单位:秒]
        private static int cycleNum;
        //是否开启日志
        private static Boolean logOpen;
        //上报地址
        private static string ipUrl;

        public FormMain()
        {
            InitializeComponent();
        }

        //Load： 初始化窗体、加载窗体资源（窗体上的各种控件），在窗体句柄创建之后、显示之前，为显示做准备。只触发一次。
        //Shown：在窗体加载后显示窗体，设置窗体属性Visible=true或form.show() 才会触发。触发一次或者不触发。
        //Activated：每次窗体获得焦点均会触发（从别的窗体或对话框切回来时）。可触发多次。
        private void FormMain_Load(object sender, EventArgs e)
        {
            listViewInfo("加载配置文件-开始");
            //首先读取配置文件，
            //string path = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "config.ini");
            if (File.Exists(configPath))
            {
                //配置文件中配置的循环周期
                string cycle = INIHelper.Read("cycle", "cycle", "", configPath);
                if (Regex.IsMatch(cycle, @"^\d*$"))
                {
                    int num = int.Parse(cycle);
                    if (num < 10)
                    {
                        num = 10;
                    }
                    numericUpDown_cycle.Value = num;
                    cycleNum = num;
                }
                //配置文件配置的是否开启日志
                string open = INIHelper.Read("log", "open", "", configPath);
                logOpen = (open != null && open.Trim().ToLower() == "true") ? true : false;
                checkBox_log.Checked = logOpen;
                //配置文件配置的上报地址
                string url = INIHelper.Read("ip", "url", "", configPath);
                textBox_url.Text = url;
                ipUrl = url;
            }
            button_check(0);
            listViewInfo("加载配置文件-结束");
        }

        //定制定时任务
        private Boolean timerStop()
        {
            //如果定时任务不为空且正在运行，则停止定时任务并释放资源。
            if (monitorTimer != null && monitorTimer.Enabled)
            {
                monitorTimer.Stop();
                monitorTimer.Close();
            }
            Boolean isStop = monitorTimer == null || !monitorTimer.Enabled?true:false;
            return isStop;
        }

        private static void timerHandler(object source, ElapsedEventArgs e)
        {
            MonitorDoor.Door(ipUrl, logOpen);
            //MonitorDoor.WriteLog(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") + " : timerHandler");
        }

        //运行脚本
        private void button_run_Click(object sender, EventArgs e)
        {
            listViewInfo("手动运行脚本-开始");
            MonitorDoor.Door(ipUrl, logOpen);
            MessageBox.Show("脚本已运行！");
            listViewInfo("手动运行脚本-结束");
        }

        //开启定时任务
        private void button_start_Click(object sender, EventArgs e)
        {
            listViewInfo("启动定时任务-开始");
            //获取设置参数，更新参数数据。
            string cycle = numericUpDown_cycle.Text;
            int num = int.Parse(cycle);
            //定时任务周期发生了变化，更新定时任务周期信息
            if(num != cycleNum)
            {
                cycleNum = num;
            }
            //日志是否开启发生了变化，更新日志开启状态。
            Boolean open = checkBox_log.Checked;
            if(open!= logOpen)
            {
                logOpen = open;
            }
            //上报地址发生了变化，更新上报地址信息
            string url = textBox_url.Text;
            if(url!= ipUrl)
            {
                ipUrl = url;
            }
            //更新配置文件中的配置信息
            if (File.Exists(configPath))
            {
                INIHelper.Write("cycle", "cycle", cycleNum.ToString(), configPath);
                INIHelper.Write("log", "open", logOpen.ToString(), configPath);
                INIHelper.Write("ip", "url", ipUrl, configPath);
            }

            //如果任务不为空且正在运行则停止任务
            Boolean stop = timerStop();
            if (!stop)
            {
                MessageBox.Show("任务未能停止！");
                listViewInfo("启动定时任务-结束:上一个任务未能停止，启动定时任务失败!");
                return;
            }
            //如果定时任务是空的，则先初始化定时任务对象
            if(monitorTimer == null)
            {
                monitorTimer = new System.Timers.Timer();
                //monitorTimer.AutoReset = false; //每到指定时间Elapsed事件是触发一次（false），还是一直触发（true）
                monitorTimer.Enabled = true;//是否触发Elapsed事件
                monitorTimer.Elapsed += new System.Timers.ElapsedEventHandler(timerHandler);
            }
            monitorTimer.Interval = num * 1000; //执行间隔时间,单位为毫秒 
            monitorTimer.Start();
            button_check(1);
            MessageBox.Show("任务已启动！");
            listViewInfo("启动定时任务-结束:任务已启动。");
        }

        //停止定时任务
        private void button_stop_Click(object sender, EventArgs e)
        {
            listViewInfo("停止定时任务-开始");
            //如果任务不为空且正在运行则停止任务
            Boolean stop = timerStop();
            if(stop)
            {
                button_check(0);
                MessageBox.Show("任务已停止！");
                listViewInfo("停止定时任务-结束:任务已停止。");
            }
            else
            {
                MessageBox.Show("任务未能停止！");
                listViewInfo("停止定时任务-结束:任务未能停止。");
            }
        }

        //关闭当前程序
        private void button_close_Click(object sender, EventArgs e)
        {
            listViewInfo("关闭当前程序-开始");
            DialogResult result = MessageBox.Show("关闭当前程序？", "操作提示", MessageBoxButtons.YesNo, MessageBoxIcon.Question);
            if (result == DialogResult.Yes)
            {
                //关闭程序之前先关闭定时任务
                Boolean stop = timerStop();
                if (!stop)
                {
                    MessageBox.Show("任务未能停止！");
                    listViewInfo("关闭当前程序-结束:任务未能停止,程序关闭失败!");
                    return;
                }
                //关闭当前窗口
                //this.Close();
                //关闭程序
                Application.Exit();
            }
        }

        //面板显示信息
        private void listViewInfo(string txt)
        {
            if(listView_info.Items.Count>10)
            {
                listView_info.Items.Clear();
            }
            listView_info.Items.Add(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") + ":" + txt);
        }

        // 选中按钮，标识按钮的选中状态
        private void button_check(int index)
        {
            if (index == 0) { button_stop.BackColor = Color.FromArgb(100, 149, 237, 0); } else { button_stop.BackColor = Color.FromArgb(0, 179, 113, 0); }
            if (index == 1) { button_start.BackColor = Color.FromArgb(100, 149, 237, 0); } else { button_start.BackColor = Color.FromArgb(0, 179, 113, 0); }
            
        }
    }
}
